package com.design.patterns.list.singleton;

/**
 * 懒汉式，双重检查。线程安全，效率高
 * @author Wangzhiwen
 */
public class SingletonF {
}

class Singleton6{

    private Singleton6() {}

    // 禁止指令重排，保证线程安全
    private volatile static Singleton6 singleton;

    /**
     * 双全检查，只有当第一次初始化对象时才会进入一个if语句。
     * 即使有两个线程进入第一个if块，在第二同步if语句中线程也是安全的。
     * 当对象被初始化完成后即对象不为null，就不会进入到同步块提升了效率。
     */
    public static Singleton6 getInstance(){
        if (singleton == null){

            synchronized (Singleton6.class){
                if (singleton == null){
                    singleton = new Singleton6();
                }
            }

        }

        return singleton;
    }
}
